package immutableclass;

import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;

public final class ImmutablePiece {

    public enum Forme {

        tour, cavalier, fou, dame, roi, pion
    }

    public enum Couleur {

        blanc, noir
    }
    private final Forme forme;
    private final Couleur couleur;
    private static final List<ImmutablePiece> protoJeuDePiece = new ArrayList<ImmutablePiece>(); // Initialise un jeu de pieces prototype
    private static Map<Couleur, Map<Forme, ImmutablePiece>> table = new EnumMap<Couleur, Map<Forme, ImmutablePiece>>(
            Couleur.class);


    static {
        for (Forme forme : Forme.values()) {
            for (Couleur couleur : Couleur.values()) {
                protoJeuDePiece.add(new ImmutablePiece(forme, couleur));
            }
        }
    }


    static {
        for (Couleur couleur : Couleur.values()) {
            Map<Forme, ImmutablePiece> couleurTable = new EnumMap<Forme, ImmutablePiece>(
                    Forme.class);
            for (Forme forme : Forme.values()) {
                couleurTable.put(forme, new ImmutablePiece(forme, couleur));
            }
            table.put(couleur, couleurTable);
        }
    }

    private ImmutablePiece(final Forme forme, final Couleur couleur) {

        this.forme = forme;
        this.couleur = couleur;
    }

    public static ArrayList<ImmutablePiece> nouveauJeuDePiece() {
        return new ArrayList<ImmutablePiece>(protoJeuDePiece);
    }

    public static ImmutablePiece valueOf(Forme forme, Couleur couleur) {
        return table.get(couleur).get(forme);
    }

    public Forme getForme() {
        return forme;
    }

    public Couleur getCouleur() {
        return couleur;
    }

    @Override
    public String toString() {

        return forme.toString() + " " + couleur;
    }
}
